/******  bibliotheques  ****************************************************/
/**/ #ifndef _Jeu
/**/ #define _Jeu
/**/ #include <stdio.h>
/**/ #include <stdlib.h>
/**/ #include "Grille.h"
/**/ #include "Joueur.h"
/**/ #include "Pion.h"
/**/ #include "Ligne.h"
/**/ #include <assert.h>
/******  fin des bibliotheques  ********************************************/

#define DIMX 7  /* On defini les dimensions de la grille */
#define DIMY 6

/** @brief Jeu.h module Jeu qui permet d'initialiser, modifier et
                 de dire si le la partie est terminee
	@author Cecile
	@author Doriane
	@file Jeu.h
	@date 2010/05/18
*/


/** @struct Jeu
            grille : une structure Grille
            JoueurCourant : entier designant le joueur qui est en train de jouer
            ligne : une structure Ligne
**/
typedef struct
{
	Grille grille;
	int joueurCourant; /* numero 1 pour X ou 2 pour O */
	Ligne ligne;
}Jeu;


/**	@brief JeuInialisation initialise le jeu en initialisant la grille du jeu,
                           ainsi que la ligne de ce jeu
 	@param[in] jeu pointeur sur une structure de type Jeu
**/
void JeuInitialise (Jeu ** jeu);


/** @brief JeuGetConstGrille renvoie l'adresse de la grille du jeu
           jeu doit etre initialise
	@param[in] jeu pointeur constant sur une structure Jeu
**/
const Grille * JeuGetConstGrille (const Jeu * jeu);


/** @brief JeuGetGrille renvoie l'adresse de la grille du jeu
           jeu doit etre initialise
	@param[in] jeu pointeur sur une structure de type Jeu
**/
Grille * JeuGetGrille (Jeu * jeu);


/** @brief JeuGetConstJoueur renvoie l'entier du joueur courant (1 ou 2)
           jeu doit etre initialise
	@param[in] jeu pointeur constant sur une structure de type Jeu
**/
int JeuGetJoueur (Jeu * jeu);


/** @brief JeuSetJoueur modifie le numero du joueur : l'entier du joueur courant (1 ou 2)
           jeu doit etre initialise
	@param[in] jeu pointeur sur une structure de type Jeu
**/
void JeuSetJoueur (Jeu * jeu);


/** @brief JeuGetConstLigne renvoie l'adresse constante de la ligne du jeu
           jeu doit etre initialise
	@param[in] jeu pointeur constant sur une structure de type Jeu
**/
Ligne * JeuGetLigne (Jeu * jeu);


/** @brief CoupJouable renvoie un entier:
                       1 si  le coup est jouable,
			c'est-a-dire si la case de la colonne selectionnee est libre,
			renvoie 0 sinon.
			grille doit etre initialisee
	@param[in] ColonneSaisie entier positif determinant le numero de la colonne
	@param[in] grille pointeur sur une structure Grille
**/
int CoupJouable (const int ColonneSaisie, const Grille * grille);


/**	@brief Gagnant renvoie 1 si le joueur venant de jouer a gagne la partie,
                   renvoie 0 sinon.
           conditions pour gain de partie : 4 memes caracteres ('X' ou 'O') alignes dans la grille
           (en ligne, en colonne ou en diagonale (on etudiera les diagonales en deux fois)
                   grille doit etre initialisee
	@param[in] grille pointeur constant sur une structure Grille
**/
int Gagnant (const Grille * grille);


/**	@brief 	LigneGagnate renvoie 1 si 4 memes caracteres ('X' ou 'O') sont alignes en ligne
            renvoie 0 sinon
            grille doit etre initialisee
	@param[in] grille pointeur constant sur une structure Grille
**/
int LigneGagnante (const Grille * grille);


/**	@brief 	ColonneGagnante renvoie 1 si 4 memes caracteres ('X' ou 'O') sont alignes en colonne
            renvoie 0 sinon
            grille doit etre initialisee
	@param[in] grille pointeur constant sur une structure Grille
**/
int ColonneGagnante (const Grille * grille);



/**	@brief 	DiagonaleDescendanteGagnante renvoie 1 si 4 memes caracteres ('X' ou 'O') sont alignes en diagonale
            (d'en haut a gauche a en bas a droite)
            renvoie 0 sinon
            grille doit etre initialisee
	@param[in] grille pointeur constant sur une structure Grille
**/
int DiagonaleDescendanteGagnante (const Grille * grille);


/**	@brief 	DiagonaleDescendanteMontante renvoie 1 si 4 memes caracteres ('X' ou 'O') sont alignes en diagonale
            (d'en bas a gauche a en haut a droite)
            renvoie 0 sinon
            grille doit etre initialisee
	@param[in] grille pointeur constant sur une structure Grille
**/
int DiagonaleMontanteGagnante (const Grille * grille);


/**	@brief 	JeuFini renvoie 1 si la partie est finie, c'est-a-dire qu'un des deux joueurs a gagne
            renvoie 0 sinon
            jeu doit etre initialise
	@param[in] jeu pointeur constant sur une structure Jeu
**/
int JeuFini (const Jeu * jeu);


/**	@brief JeuActionClavier deplace le pion d'une case :
            vers la gauche si l'utilisateur appuie sur la fleche gauche,
            vers la droite si l'utilisateur appuie sur la fleche droite.
            place le pion dans la grille si l'utilisateur appuie sur la fleche du bas.
            jeu doit etre initialise
	@param[in] jeu pointeur sur une structure Jeu
	@param[in] direction caractere constant correspondant a la touche tappee par l'utilisateur.
**/
void JeuActionClavier (Jeu * jeu, const char direction);


/**	@brief JeuBoucle deroule le cours de la partie jusqu'a sa fin
            (c'est-a-dire jusqu'a temps ou 4 pions sont alignes)
            jeu doit etre initialise
	@param[in] jeu pointeur sur une structure Jeu
**/
void JeuBoucle (Jeu * jeu);


/**	@brief JeuAffiche affiche le jeu en cours, c'est-a-dire la grille et la ligne du jeu
            jeu doit etre initialise
	@param[in] jeu pointeur constant sur une structure Jeu
**/
void JeuAffiche (Jeu * jeu);


/**	@brief JeuEfface efface le jeu en cours,
                c'est-a-dire que la memoire utilisee pour ce jeu est liberee
            jeu doit etre initialise
	@param[in] jeu pointeur constant sur une structure Jeu
**/
void JeuEfface(Jeu* jeu);


#endif
